<?php

if (!function_exists("sys_loader_directory")) {
    /* -------------------------------------------------------------------------------------------------
     * FUNCAO RESPONSAVEL PELA INTERACAO COM AS PASTA DE MODULOS E BIBLIOTECAS DO SISTEMA
     * @PARAM STRING $nameFolder = 'nome da pasta que ira ser percorrida pela funcao'
     * @PARAM BOOL $fullPath   = 'nome da pasta que ira ser percorrida pela funcao'
     * @PARAM BOOL $file       = 'qndo verdadeiro retorna o caminho mais o nome do arquivo'
     * RETURN ARRAY
     * ------------------------------------------------------------------------------------------------- */

    function sys_loader_directory($nameFolder, $fullpath = false, $file = false) {
        try {
            if (!$fullpath) {
                $dir = BASEPATH . $nameFolder;
            } else {
                $dir = $nameFolder;
            }
            if (!file_exists($dir)) {
                throw new Exception("Arquivo ou diretorio ({$nameFolder}) nao existe.", 0);
            }
            $output = array();
            $recursive = new RecursiveDirectoryIterator($dir);
            $carregamento = new RecursiveIteratorIterator($recursive, RecursiveIteratorIterator::SELF_FIRST);
            foreach ($carregamento as $folders) {
                if (!$file) {
                    $find = $folders->isDir();
                } else {
                    $find = $folders->isFile();
                }
                if ($find) {
                    if ($folders->getBasename() === "." || $folders->getBasename() === "..") {   continue;  }
                    $output[] = str_replace("\\", "/", $folders->getPathname()) . "/";
                }
            }
            return $output;
        } catch (Exception $exc) {
            exit($exc->getMessage());
        }
    }

}


if (!function_exists("sys_autoloader")) {
    /* -------------------------------------------------------------------------------------------------
     * FUNCAO RESPONSAVEL PELA INCLUSAO DAS CLASSES DE MODULOS E BLIBIOTECAS DO SISTEMA
     * @PARAM STRING $className = 'Nome da classe que sera incluido no sistem assim que o objeto 
     * do mesmo for instaciado'
     * @param ARRAY $arr  = 'Array com os diretorios inclusos no arquivo config/loader'
     * RETURN VOID
     * ------------------------------------------------------------------------------------------------- */

    function sys_autloader($className) {
        global $result;
        foreach ($result as $dir) {
            if (file_exists($dir . "{$className}.class.php")) {
                //echo strtolower($dir . "{$className}.class.php")."<br";
                include_once strtolower($dir . "{$className}.class.php");
                break;
            }
        }
        $_class = strtolower($className);
        if (substr($_class, 0, 16) === "smarty_internal_" || $_class == "smarty_security") {
            include SMARTY_SYSPLUGINS_DIR . $_class . ".php";
        }
    }

}

//-------------------------------------------------------------------------------------------------
//FAZ O CARREGAMENTO DAS BIBLIOTECAS QUE SERAO USADOS
//-------------------------------------------------------------------------------------------------
$loader[$libs_folders] = array('smarty','upload');

//-------------------------------------------------------------------------------------------------
//FAZ O CARREGAMENTO DOS MODULOS QUE SERAO USADOS 
//-------------------------------------------------------------------------------------------------
$loader[$model_folder] = array('db', 'login', 'user');


//-------------------------------------------------------------------------------------------------
//FAZ O CARREGAMENTO DOS CORE(ENGINE) QUE SERAO USADOS 
//****ATENCAO AO ALTERAR ESTA VARIAVEL POIS O NUCLEO DO SISTEMA E BASEADO NESTA VARIAVEL
//-------------------------------------------------------------------------------------------------
$loader['core'] = array('uri', 'kernnel','xml');

//-------------------------------------------------------------------------------------------------
//FAZ O CARREGAMENTO DOS controller(ENGINE) QUE SERAO USADOS 
//****ATENCAO AO ALTERAR ESTA VARIAVEL
//-------------------------------------------------------------------------------------------------
$loader['controllers'] = array('');

/* -------------------------------------------------------------------------------------------------
 * PECORRE OS MODULOS E BIBLIOTECAS DE QUE SERAO CARREGADO NO SISTEMA
 * E CRIA UM ARRAY UNICO PARA O AUTOLOADER
 * //****ATENCAO AO ALTERAR ESTE TRECHO DE CODIGO
 * ----------------------------------------------------------------------------------------------- */
$result = array();
foreach ($loader as $k => $v) {
    $parent = "{$k}/";
    foreach ($v as $i => $childs) {
        $dir = $parent . $childs;
        
        $result[] = preg_replace("@(\/{2})$@", "/", BASEPATH . "{$k}/$v[$i]/");
        $result = array_merge($result, sys_loader_directory($dir));
    }
}

//var_dump($result);
/* -------------------------------------------------------------------------------------------------
 * INSTANCIA AS CLASSES DAS BIBLIOTECAS E DOS MODULOS AUTOMATICAMENTE
 * spl_autoload_register => DOC(http://php.net/manual/pt_BR/function.spl-autoload-register.php)
 * ----------------------------------------------------------------------------------------------- */
spl_autoload_register("sys_autloader");
